﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data;

//Các hàm mở rộng, extension để lấy dữ liệu cho nhanh
public static class ExtensionFunction
{
    /// <summary>
    /// Lấy value của ô TextBox với kiểu giá trị tương ứng từ giá trị Text
    /// </summary>
    public static T GetValue<T>(this TextBox txt)
    {
        return Globals.Object_GetValue<T>(txt.Text);
    }

    /// <summary>
    /// Lấy value của ô TextBox với kiểu giá trị tương ứng từ giá trị FormGlobals (giá trị lưu ngầm của textbox)
    /// </summary>
    public static T GetValue_Form<T>(this TextBox txt)
    {
        return FormGlobals.Control_GetValue<T>(txt);
    }


    /// <summary>
    /// Kiểm tra textbox có nhập giữ liệu không, tương ứng với String.IsNullOrEmpty(string svalue)
    /// </summary>
    public static bool IsEmpty(this TextBox txt)
    {
        return String.IsNullOrEmpty(txt.Text);
    }

    /// <summary>
    /// Kiểm tra textbox có nhập giữ liệu không, tương ứng với String.IsNullOrEmpty(string svalue)
    /// </summary>
    public static bool IsNotEmpty(this TextBox txt)
    {
        return !String.IsNullOrEmpty(txt.Text);
    }

    public static void SetText(this TextBox txt,object objValue, string sFormat = "")
    {
        if (!String.IsNullOrEmpty(sFormat))
            FormGlobals.TextBox_SetFormat(sFormat);
        //
        FormGlobals.TextBox_SetValue(objValue, txt);
    }

    /// <summary>
    /// Focus vào ô Textbox, select All
    /// </summary>
    public static void SetFocus_SelectAll(this TextBox txt)
    {
        txt.Focus();
        txt.SelectAll();
    }

    /// <summary>
    /// Lấy value của DataGridViewRow với kiểu giá trị tương ứng truyền vào
    /// </summary>
    /// 
    public static T GetValue<T>(this DataGridViewRow dgvr, string cellName)
    {
        return Globals.Object_GetValue<T>(dgvr.Cells[cellName].Value);
    }

    /// <summary>
    /// Lấy value của DataRow với kiểu giá trị tương ứng truyền vào, nếu null => nhận giá trị nullValue
    /// </summary>
    /// 
    public static T GetValue<T>(this DataRow dr, string cellName, object nullValue)
    {
        if (dr[cellName] == null || dr[cellName] == DBNull.Value)
            dr[cellName] = nullValue;
        //
        return Globals.Object_GetValue<T>(dr[cellName]);
    }

    /// <summary>
    /// Xử lý convert font từ Unicode sang TCVN, nếu ko phải Unicode thì bỏ qua
    /// </summary>
    /// <param name="sValue"></param>
    /// <returns></returns>
    public static string UnicodeToTcvn(this String sValue)
    {
        return UnicodeConvert.UnicodeToTCVN3(sValue);
    }

    /// <summary>
    /// Convert từ Tcvn sang Unicode, nếu đã là Unicode rồi thì bỏ qua
    /// </summary>
    /// <param name="sValue"></param>
    /// <returns></returns>
    public static string TcvnToUnicode(this String sValue)
    {
        return UnicodeConvert.TCVN3ToUnicode(sValue);
    }
}

//--Xử lý convert font chữ
public class UnicodeConvert
{
    private static char[] tcvnchars = {
        'µ', '¸', '¶', '·', '¹', 
        '¨', '»', '¾', '¼', '½', 'Æ', 
        '©', 'Ç', 'Ê', 'È', 'É', 'Ë', 
        '®', 'Ì', 'Ð', 'Î', 'Ï', 'Ñ', 
        'ª', 'Ò', 'Õ', 'Ó', 'Ô', 'Ö', 
        '×', 'Ý', 'Ø', 'Ü', 'Þ', 
        'ß', 'ã', 'á', 'â', 'ä', 
        '«', 'å', 'è', 'æ', 'ç', 'é', 
        '¬', 'ê', 'í', 'ë', 'ì', 'î', 
        'ï', 'ó', 'ñ', 'ò', 'ô', 
        '­', 'õ', 'ø', 'ö', '÷', 'ù', 
        'ú', 'ý', 'û', 'ü', 'þ', 
        '¡', '¢', '§', '£', '¤', '¥', '¦'
    };

    private static char[] unichars = {
        'à', 'á', 'ả', 'ã', 'ạ', 
        'ă', 'ằ', 'ắ', 'ẳ', 'ẵ', 'ặ', 
        'â', 'ầ', 'ấ', 'ẩ', 'ẫ', 'ậ', 
        'đ', 'è', 'é', 'ẻ', 'ẽ', 'ẹ', 
        'ê', 'ề', 'ế', 'ể', 'ễ', 'ệ', 
        'ì', 'í', 'ỉ', 'ĩ', 'ị', 
        'ò', 'ó', 'ỏ', 'õ', 'ọ', 
        'ô', 'ồ', 'ố', 'ổ', 'ỗ', 'ộ', 
        'ơ', 'ờ', 'ớ', 'ở', 'ỡ', 'ợ', 
        'ù', 'ú', 'ủ', 'ũ', 'ụ', 
        'ư', 'ừ', 'ứ', 'ử', 'ữ', 'ự', 
        'ỳ', 'ý', 'ỷ', 'ỹ', 'ỵ', 
        'Ă', 'Â', 'Đ', 'Ê', 'Ô', 'Ơ', 'Ư'
    };

    private static char[] tcvncharsA = {
        'µ', '¸', '¶', '·', '¹', 
        '»', '¾', '¼', '½', 'Æ', 
        'Ç', 'Ê', 'È', 'É', 'Ë', 
        'Ì', 'Ð', 'Î', 'Ï', 'Ñ', 
        'Ò', 'Õ', 'Ó', 'Ô', 'Ö', 
        '×', 'Ý', 'Ø', 'Ü', 'Þ', 
        'ß', 'ã', 'á', 'â', 'ä', 
        'å', 'è', 'æ', 'ç', 'é', 
        'ê', 'í', 'ë', 'ì', 'î', 
        'ï', 'ó', 'ñ', 'ò', 'ô', 
        'õ', 'ø', 'ö', '÷', 'ù', 
        'ú', 'ý', 'û', 'ü', 'þ', 
        '¡', '¢', '§', '£', '¤', '¥', '¦',
        'µ', '¸', '¶', '·', '¹', 
        '¨', '»', '¾', '¼', '½', 'Æ', 
        '©', 'Ç', 'Ê', 'È', 'É', 'Ë', 
        '®', 'Ì', 'Ð', 'Î', 'Ï', 'Ñ', 
        'ª', 'Ò', 'Õ', 'Ó', 'Ô', 'Ö', 
        '×', 'Ý', 'Ø', 'Ü', 'Þ', 
        'ß', 'ã', 'á', 'â', 'ä', 
        '«', 'å', 'è', 'æ', 'ç', 'é', 
        '¬', 'ê', 'í', 'ë', 'ì', 'î', 
        'ï', 'ó', 'ñ', 'ò', 'ô', 
        '­', 'õ', 'ø', 'ö', '÷', 'ù', 
        'ú', 'ý', 'û', 'ü', 'þ'
    };

    private static char[] unicharsA = {
        'À', 'Á', 'Ả', 'Ã', 'Ạ', 
        'Ằ', 'Ắ', 'Ẳ', 'Ẵ', 'Ặ', 
        'Ầ', 'Ấ', 'Ẩ', 'Ẫ', 'Ậ', 
        'È', 'É', 'Ẻ', 'Ẽ', 'Ẹ', 
        'Ề', 'Ế', 'Ể', 'Ễ', 'Ệ', 
        'Ì', 'Í', 'Ỉ', 'Ĩ', 'Ị', 
        'Ò', 'Ó', 'Ỏ', 'Õ', 'Ọ', 
        'Ồ', 'Ố', 'Ổ', 'Ỗ', 'Ộ', 
        'Ờ', 'Ớ', 'Ở', 'Ỡ', 'Ợ', 
        'Ù', 'Ú', 'Ủ', 'Ũ', 'Ụ', 
        'Ừ', 'Ứ', 'Ử', 'Ữ', 'Ự', 
        'Ỳ', 'Ý', 'Ỷ', 'Ỹ', 'Ỵ', 
        'Ă', 'Â', 'Đ', 'Ê', 'Ô', 'Ơ', 'Ư',
        'à', 'á', 'ả', 'ã', 'ạ', 
        'ă', 'ằ', 'ắ', 'ẳ', 'ẵ', 'ặ', 
        'â', 'ầ', 'ấ', 'ẩ', 'ẫ', 'ậ', 
        'đ', 'è', 'é', 'ẻ', 'ẽ', 'ẹ', 
        'ê', 'ề', 'ế', 'ể', 'ễ', 'ệ', 
        'ì', 'í', 'ỉ', 'ĩ', 'ị', 
        'ò', 'ó', 'ỏ', 'õ', 'ọ', 
        'ô', 'ồ', 'ố', 'ổ', 'ỗ', 'ộ', 
        'ơ', 'ờ', 'ớ', 'ở', 'ỡ', 'ợ', 
        'ù', 'ú', 'ủ', 'ũ', 'ụ', 
        'ư', 'ừ', 'ứ', 'ử', 'ữ', 'ự', 
        'ỳ', 'ý', 'ỷ', 'ỹ', 'ỵ'
    };


    private static char[] convertTable;

    static UnicodeConvert()
    {
        convertTable = new char[256];

        for (int i = 0; i < 256; i++)
            convertTable[i] = (char)i;

        for (int i = 0; i < tcvnchars.Length; i++)
            convertTable[tcvnchars[i]] = unichars[i];

    }

    /// <summary>
    /// Convert Unicode sang TCVN, nếu đã là font TCVN rồi thì bỏ qua
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public static string UnicodeToTCVN3(string value)
    {
        //if (IsUnicodeFormat(value))
        //{
            for (int i = 0; i < unicharsA.Length; i++)
            {
                value = value.Replace(unicharsA[i], tcvncharsA[i]);
            }
        //}
        return value;
    }

    /// <summary>
    /// Convert chuỗi từ định dạng font TCVN3 sang Unicode
    /// Có kiểm tra đã là Unicode rồi thì không convert nữa
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public static string TCVN3ToUnicode(string value)
    {
        //Nếu không phải là định dạng Unicode thì mới convert ngược lại
        //if (!IsUnicodeFormat(value))
        //{
            char[] chars = value.ToCharArray();
            for (int i = 0; i < chars.Length; i++)
                if (chars[i] < (char)256) //> là thuộc mã Unicode
                    chars[i] = convertTable[chars[i]];
            return new string(chars);
        //}
        //else
        //    return value;
    }

    public static bool IsUnicodeFormat(string value)
    {
        //byte[] abCharacters = System.Text.Encoding.Unicode.GetBytes(value);
        //string sConverted = System.Text.Encoding.Unicode.GetString(abCharacters);
        //return (value == sConverted);

        value = value.ToLower();
        bool retVal = true;
        char[] charContent = value.ToCharArray();
        foreach (char c in charContent)
        {
            if (Array.IndexOf(tcvnchars, c) >= 0)
            {
                retVal = false;
                break;
            }
        }
        return retVal;
    }



    public static void UnicodeToTCVN3(ref DataTable dt)
    {
        foreach (DataColumn col in dt.Columns)
        {
            col.ColumnName = UnicodeToTCVN3(col.ColumnName);
        }
        foreach (DataRow dr in dt.Rows)
        {
            foreach (DataColumn dCol in dt.Columns)
            {
                if (dCol.DataType == typeof(String))
                {
                    dr[dCol] = UnicodeToTCVN3(Convert.ToString(dr[dCol]));
                }
            }
        }
    }
}

